
package ChatGUI;

import java.awt.BorderLayout;

import java.awt.Image;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * Fenêtre de connexion au chat
 * @author Marion et Nicolas
 */
public final class ConnectWindow extends JFrame implements ActionListener, ListSelectionListener, WindowListener{


private static String logRemote;
private ChatGUI gui;
// Objets utilises pour la fenêtre connect
private JPanel panel = new JPanel();
private Image logo;
private JMenuBar menuBar = new JMenuBar();
private JMenu menu1 = new JMenu();
private JMenu menu2 = new JMenu();
private JMenuItem menuItem1 = new JMenuItem();
private JMenuItem menuItem3 = new JMenuItem();
private JLabel labelInfo;
private JLabel labelInfo2;
private JLabel labelListe = new JLabel("List of connected users");
/**
 * Sert à remplir une liste initiale
 */
protected static DefaultListModel userInList = new DefaultListModel();   
/**
 * Liste d'users
 */
protected static JList listUser;
private JButton send = new JButton("Send");
private JTextField textToSend = new JTextField();
private JTextArea areaConversation = new JTextArea();


// Objets utilises pour la mini-fenêtre de demande de conversation   
private JFrame frameAsker = new JFrame();
private JLabel labelAsker = new JLabel("Do you want to text to this user ?");
private JButton yes = new JButton("Yes");
private JButton no = new JButton("No");


// Objets utilise pour la fenêtre about
private JLabel labelAbout;
private JButton back = new JButton("Back");;


/**
 * Création d'une nouvelle fenêtre de connexion
 * @param etat
 * @param login
 * @param g 
 */
protected ConnectWindow(String etat,String login,ChatGUI g){
       gui=g;
       etatConnect(etat,login);
       menuItem1.addActionListener(this);
       menuItem3.addActionListener(this);
       textToSend.addActionListener(this);
       send.addActionListener(this);
       listUser.addListSelectionListener(this);
       yes.addActionListener(this);
       no.addActionListener(this);
       back.addActionListener(this);
       this.addWindowListener(this);
}


/**
 * Fenêtre principale affichée lors de la connexion du localUser
 * @param etat
 * @param login 
 */
 protected void etatConnect(String etat,String login) {
     this.setSize(1000,700);
     this.setTitle("Welcome here !!!");
     
     labelInfo = new JLabel("You are connected with the following name : " +login);
     labelInfo2 = new JLabel("<html>You are the addresse of all messages appearing below<br>"
                + "===> All messages you will send here will be received by EVERY user online.</html>");
     
     ChatGUI.logLocal = login;                                      // Car sinon, on ne peut pas le
                                                            // recuperer dans l'action performed  
     listUser = new JList(userInList);
     areaConversation.setEditable(false);               // Pour qu'on ne puisse pas écrire dedans
     areaConversation.setLineWrap(true);
     
     menu1.setText("File");
     menu2.setText("About");
     menuItem1.setText("Disconnect");
     menuItem3.setText("Informations about us");
     menu1.add(menuItem1);
     menu2.add(menuItem3);
     menuBar.add(menu1);
     menuBar.add(menu2);
     
     JScrollPane scroll = new JScrollPane(textToSend);
     JScrollPane scroll2 = new JScrollPane(areaConversation);
     
     labelInfo.setBounds(50,20,300,30);
     labelInfo2.setBounds(50,60,450,50);
     labelListe.setBounds(720,130,200,50);
     listUser.setBounds(720,170,180,350);
     send.setBounds(560,580,90,48);
     scroll.setBounds(50,580,500,50);
     scroll2.setBounds(50,100,600,450);
     
     this.setLayout(null);   
     this.setLocationRelativeTo(null);          // Fenêtre centrée autour de l'écran
     this.setJMenuBar(menuBar);
     this.add(labelInfo);   
     this.add(labelInfo2);
     this.add(labelListe);
     this.add(listUser);                          
     this.add(send);
     this.add(scroll);
     this.add(scroll2);

     
     this.setVisible(true);   
     if (etat.equals("FERMETURE")){
         this.setVisible(false);
     }
     
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 
 
 
 
 
 /**
  * Fenetre de demande de confirmation pour ouvrir une conversation avec un utilisateur séléctionné
  * @param login
  * @param openWindow 
  */
    private void asker (String login, boolean openWindow){
        logRemote = login;
        frameAsker.setSize(380,200);
        frameAsker.setTitle("Discussion request with "+login);
        
        labelAsker.setBounds(80,20,300,20);
        yes.setBounds(50,90,100,40);
        no.setBounds(200,90,100,40);

        frameAsker.setLayout(null);
        frameAsker.add(labelAsker);
        frameAsker.add(yes);
        frameAsker.add(no);
        frameAsker.setLocationRelativeTo(null);          // Fenêtre centré autour de l'écran
        frameAsker.setVisible(true);
        
        if (!openWindow){
            frameAsker.setVisible(false);
            frameAsker.remove(labelAsker);
        }
    }
    
    
    
    
    
    /**
     * Fenêtre d'information à propos de notre project team
     * @param etat 
     */
    private void aboutUs (boolean etat) {

        labelAbout = new JLabel("<html>Hi !!! We are two students in a French engineering school called INSA Toulouse<br> <br> <br>"
                + "We designed this program (ChatSystem in local network) during a COO/POO course.<br> <br> <br>"
                + "bla bla bla<br> <br> <br>"
                + "bla bla bla<br> <br> <br>"
                + "Have a nice day ! <br> <br> </html>"); 
        labelAbout.setBounds(20,50,500,500);
        back.setBounds(20,20,90,30);

        setContentPane(new DisplayPicture("2")); 
        getContentPane().setLayout(new BorderLayout()); 
        
        this.setLayout(null);   
        this.setLocationRelativeTo(null);          // Fenêtre centrée autour de l'écran
        this.setJMenuBar(menuBar);
        this.add(labelAbout); 
        this.add(back);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        
        if (!etat) {
            this.remove(back);
            this.remove(labelAbout);
            this.setVisible(false);
        }
     }


      /**
     * Ajout d'un user nouvellement conecté dans la liste
     * @param user 
     */
    protected void addInList(String user) {
                System.out.println("dans le addInList");
                userInList.addElement(user);
                System.out.println("dans le addInList2");
                listUser.updateUI();
                System.out.println("Nouveau user => Liste mise à jour");
    }
    
    
     /**
     * Suppression d'un user ayant quitté le chat de la liste
     * @param user 
     */
    protected void removeFromList(String user) {
                userInList.removeElement(user);
                listUser.updateUI();
                System.out.println("Un user est parti => Liste mise à jour");
    }
    
       /**
     * vide la liste des utilisateurs
     */
    protected void emptyingList(){
                userInList.removeAllElements();
                listUser.updateUI();
                System.out.println("Liste vidée !");
    }
    
       /**
     * Affiche tout les messages destinés au localUser
     * @param log
     * @param messageTexte 
     */
    protected void afficherMessage(String log, String messageTexte){
            areaConversation.append(log+" says : "+messageTexte+"\n");
            textToSend.setText("");  
    }
    
    
    
    
   
     /**
     * Méthode appartenant à l'interface ActionListener
     * Effectue différentes actions à l'arrivée d'évènements
     * @param e 
     */
@Override
    public void actionPerformed(ActionEvent e) {

                if(e.getSource() == menuItem1){
                    gui.performDisconnect();
                    etatConnect("FERMETURE","");            // Avec 5, on quitte la fenêtre connect
                    // On repart à la fenêtre de départ
                }
                
                if(e.getSource() == menuItem3){
                    //etatConnect("FERMETURE","");
                    aboutUs(true);
                }
                                
                
                if(e.getSource() == textToSend){
                    e.setSource(send);                            // Envoie quand on appuie touche "Entree"
                    
                }
                
                if(e.getSource() == send){
                    String messToSend = textToSend.getText();
                    gui.performSendTextAll(messToSend);
                    areaConversation.append(ChatGUI.logLocal+" says : "+messToSend+"\n"); // Append permet de concaténer
                    textToSend.setText("");                                           // Effacer le JTextField après envoie
                }
                
                //Pour la mini fenetre asker
                if(e.getSource()==yes){
                    String log = logRemote;
                    this.asker("",false);
                    System.out.println("Debut de conversation avec "+log);
                    gui.startingConversation(log);
                    areaConversation.append("Starting conversation with "+log+"...\n");
                }
                
                if(e.getSource()==no){
                    this.asker("",false);
                }
                
                // Pour la fenêtre about
                if(e.getSource() == back){
                    aboutUs(false);
                    gui.connection();
                }
    }

/**
 * Methode appelée lorsque l'on appuie sur un utilisateur dans la JList
 * @param e 
 */
@Override
     public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()){                    // Car sinon, le click appele 2 fois valueChanged
          String nomUserSelected=(String)listUser.getSelectedValue();
          asker(nomUserSelected,true);
        }
     }

    
/**
 * Envoi d'un BYE lorsque l'on quitte l'application (sans cliquer sur Disconnect)
 * @param e 
 */
    @Override
    public void windowClosing(WindowEvent e) {
        gui.performDisconnect();
    }
    
  /**
   * Méthode du window listener
   * @param e 
   */
    @Override public void windowOpened(WindowEvent e) {System.out.print("");}
      /**
   * Méthode du window listener
   * @param e 
   */
    @Override public void windowClosed(WindowEvent e) {System.out.print("");}
      /**
   * Méthode du window listener
   * @param e 
   */
    @Override public void windowIconified(WindowEvent e) {System.out.print("");}
      /**
   * Méthode du window listener
   * @param e 
   */
    @Override public void windowDeiconified(WindowEvent e) {System.out.print("");}
      /**
   * Méthode du window listener
   * @param e 
   */
    @Override public void windowActivated(WindowEvent e) {System.out.print("");}
      /**
   * Méthode du window listener
   * @param e 
   */
    @Override public void windowDeactivated(WindowEvent e) {System.out.print("");}


}
